#!/bin/bash
###
 # @Author: superC
 # @Date: 2024-10-31
 # @Description: 【超炫文档-操作手册】[测试环境]自动发布脚本
 # @参数说明：
 #  1、第一个参数：远程服务器密码；
 #  2、第二个参数：是否重新打包项目，若否则输入false，若是则无需输入；
###
echo "【超炫文档-操作手册】[测试环境]自动发布脚本"

# 一、定义一些常量信息
# 获取脚本所在目录
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

# 获取脚本所在目录的上一级目录
PARENT_DIR="$(dirname "$SCRIPT_DIR")"

# 本地tar文件名称
LOCAL_TAR_FILE="html.tar"

# 远程服务器信息
REMOTE_HOST="192.168.1.200"         # 远程服务器IP
REMOTE_PORT="22"                    # 远程服务器ssh端口
REMOTE_USER="root"                  # 远程服务器用户
REMOTE_PASSWORD="$1"                # 远程服务器密码
# 远程服务器文件传输目录
REMOTE_DIR="/usr/local/docker/services/doc/superc_doc"

# 指令参数
PACKAGE_MARK="$2" 

echo "[基础环境] 服务器IP：$REMOTE_HOST"
echo "[基础环境] 用户：$REMOTE_PORT"


# 二、定义一些函数
# 检查打包命令是否成功的函数 
check_success() {
  if [ $? -ne 0 ]; then
    echo "[错误] $1"
    exit 1
  fi
}

# 三、检查一些工具
# 检查sshpass是否存在
USE_SSHPASS=false
if command -v sshpass > /dev/null 2>&1; then
  if [ -z "$REMOTE_PASSWORD" ]; then
    echo "[警告] 检测到sshpass，但未提供密码。将使用常规方式登录。"
  else
    USE_SSHPASS=true
  fi
else
  echo "[警告] 未检测到sshpass，使用常规的密码提示方式。" 
fi

# 检查是否需要重新打包
HAS_PACKAGED=true
if [ -z "$PACKAGE_MARK" ]; then
    echo "[提示] 未检测到输入指令，默认重新打包项目。"
else
    if [ "$PACKAGE_MARK" = false ]; then
      echo "[提示] 检测到输入指令，无需重新打包。"
      HAS_PACKAGED=false
    else
      echo "[提示] 检测到输入指令，但输入有误，重新打包项目。"
    fi
fi



# 四、开始执行本地一些命令
# 打包
if [ "$HAS_PACKAGED" = true ]; then
  echo "[本地-第1步] 项目开始NPM打包"
  echo "打包中..."
  npm run build > /dev/null 2>&1
  check_success "[错误] 项目NPM打包失败"

  echo "[本地-第2步] 删除旧的tar文件"
  rm -f $LOCAL_TAR_FILE > /dev/null 2>&1 

  echo "[本地-第3步] 生成新的tar文件"
  tar -cvf $LOCAL_TAR_FILE html > /dev/null 2>&1
  check_success "[错误] 打包[tar] html目录失败"
else
  if [ ! -e "$LOCAL_TAR_FILE" ]; then
    echo "[错误] $LOCAL_TAR_FILE 不存在，重新进行打包"
    echo "[本地-第1步] 项目开始NPM打包"
    echo "打包中..."
    npm run build > /dev/null 2>&1
    check_success "[错误] 项目NPM打包失败"
    
    echo "[本地-第3步] 生成新的tar文件"
    tar -cvf $LOCAL_TAR_FILE html > /dev/null 2>&1
    check_success "[错误] 打包[tar] html目录失败"
  fi
fi

echo "[本地-第4步] 正在将压缩包文件通过SCP传输到服务器..."
if [ "$USE_SSHPASS" = true ]; then
  sshpass -p "$REMOTE_PASSWORD" scp -P $REMOTE_PORT $LOCAL_TAR_FILE $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR
else
  scp -P $REMOTE_PORT $LOCAL_TAR_FILE $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR 
fi
check_success "[错误] SCP文件传输失败"


# 五、定义在远程服务器上执行的脚本内容
REMOTE_SCRIPT=$(cat << EOF
#!/bin/bash
cd $REMOTE_DIR

if [ ! -e "$LOCAL_TAR_FILE" ]; then
  echo "[错误] $LOCAL_TAR_FILE 不存在"
  exit 1
fi

echo "[服务器-第1步] 删除之前项目包"
rm -rf html

echo "[服务器-第2步] 解压最新tar包"
tar -xvf $LOCAL_TAR_FILE > /dev/null 2>&1
if [ $? -ne 0 ]; then
  echo "[错误] $LOCAL_TAR_FILE 解压失败"
  exit 1
fi

echo "[服务器-第3步] 重启Docker服务"
docker-compose restart

echo "[提示] 发布成功"
EOF
)


# 六、登录服务器并执行脚本
echo "[提示] 文件传输完成，正在登录服务器并执行脚本..."
if [ "$USE_SSHPASS" = true ]; then
  sshpass -p "$REMOTE_PASSWORD" ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" "bash -s" <<EOF  
$REMOTE_SCRIPT
EOF
else
  ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" "bash -s" <<EOF
$REMOTE_SCRIPT
EOF
fi
check_success "[错误] 远程脚本执行失败"
  
echo "脚本执行完毕！"

cd - > /dev/null 2>&1 || exit  
  